<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.3.4" />
<title>uthash ChangeLog</title>
<style type="text/css">
/* Debug borders */
p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
/*
  border: 1px solid red;
*/
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
  color: navy;
}

strong {
  font-weight: bold;
  color: #083194;
}

tt {
  color: navy;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  font-family: sans-serif;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}

div.sectionbody {
  font-family: serif;
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

ul, ol, li > p {
  margin-top: 0;
}

pre {
  padding: 0;
  margin: 0;
}

span#author {
  color: #527bbd;
  font-family: sans-serif;
  font-weight: bold;
  font-size: 1.1em;
}
span#email {
}
span#revision {
  font-family: sans-serif;
}

div#footer {
  font-family: sans-serif;
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
div#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
div#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

div#preamble {
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-right: 10%;
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.5em;
  margin-bottom: 2.5em;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  color: #527bbd;
  font-family: sans-serif;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}

div.listingblock {
  margin-right: 0%;
}
div.listingblock > div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock {
  padding-left: 2.0em;
}
div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock {
  padding-left: 2.0em;
}
div.verseblock > div.content {
  white-space: pre;
}
div.verseblock > div.attribution {
  padding-top: 0.75em;
  text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 2px solid silver;
}

div.exampleblock > div.content {
  border-left: 2px solid silver;
  padding: 0.5em;
}

div.imageblock div.content { padding-left: 0; }
div.imageblock img { border: 1px solid silver; }
span.image img { border-style: none; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: normal;
  color: navy;
}
dd > *:first-child {
  margin-top: 0.1em;
}

ul, ol {
    list-style-position: outside;
}
ol.arabic {
  list-style-type: decimal;
}
ol.loweralpha {
  list-style-type: lower-alpha;
}
ol.upperalpha {
  list-style-type: upper-alpha;
}
ol.lowerroman {
  list-style-type: lower-roman;
}
ol.upperroman {
  list-style-type: upper-roman;
}

div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
  margin-top: 0.1em;
  margin-bottom: 0.1em;
}

div.tableblock > table {
  border: 3px solid #527bbd;
}
thead {
  font-family: sans-serif;
  font-weight: bold;
}
tfoot {
  font-weight: bold;
}
td > div.verse {
  white-space: pre;
}
p.table {
  margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
  border-style: none;
}
div.tableblock > table[frame="hsides"] {
  border-left-style: none;
  border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
  border-top-style: none;
  border-bottom-style: none;
}


div.hdlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hdlist tr {
  padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
  font-weight: bold;
}
td.hdlist1 {
  vertical-align: top;
  font-style: normal;
  padding-right: 0.8em;
  color: navy;
}
td.hdlist2 {
  vertical-align: top;
}
div.hdlist.compact tr {
  margin: 0;
  padding-bottom: 0;
}

.comment {
  background: yellow;
}

@media print {
  div#footer-badges { display: none; }
}

div#toctitle {
  color: #527bbd;
  font-family: sans-serif;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}
/* Workarounds for IE6's broken and incomplete CSS2. */

div.sidebar-content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}
div.sidebar-title, div.image-title {
  color: #527bbd;
  font-family: sans-serif;
  font-weight: bold;
  margin-top: 0.0em;
  margin-bottom: 0.5em;
}

div.listingblock div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock-attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock-content {
  white-space: pre;
}
div.verseblock-attribution {
  padding-top: 0.75em;
  text-align: left;
}

div.exampleblock-content {
  border-left: 2px solid silver;
  padding-left: 0.5em;
}

/* IE6 sets dynamically generated links as visited. */
div#toc a:visited { color: blue; }
</style>
</head>
<body>
<div id="header">
<h1>uthash ChangeLog</h1>
</div>
<div id="preamble">
<div class="sectionbody">
<a style="float: right; padding-right: 50px" href="http://sourceforge.net/projects/uthash"><img style="border: 0" src="http://sflogo.sourceforge.net/sflogo.php?group_id=163879&amp;type=13" width="120" height="30" alt="uthash at SourceForge.net" /></a>
<div class="paragraph"><p>Click to return to the <a href="file:index.html">uthash home page</a>.</p></div>
</div>
</div>
<h2 id="_version_1_6_2009_05_08">Version 1.6 (2009-05-08)</h2>
<div class="sectionbody">
<div class="paragraph"><p>Special thanks to Alfred Heisner for contributing several enhancements:</p></div>
<div class="ulist"><ul>
<li>
<p>
Support for two new hash functions:
</p>
<div class="ulist"><ul>
<li>
<p>
the Paul Hsieh hash function (<tt>HASH_SFH</tt>)
</p>
</li>
<li>
<p>
Austin Appleby&#8217;s MurmurHash function (<tt>HASH_MUR</tt>)
</p>
</li>
</ul></div>
</li>
<li>
<p>
Because of its excellent performance, MurmurHash is now the default hash function.
</p>
</li>
<li>
<p>
<tt>keystats</tt> now has much better elapsed time accuracy under Cygwin and MinGW
</p>
</li>
<li>
<p>
fixed casting in <tt>HASH_FNV</tt>, <tt>HASH_SAX</tt> and <tt>HASH_OAT</tt> for non-char keys
</p>
</li>
</ul></div>
<div class="paragraph"><p>This release also includes:</p></div>
<div class="ulist"><ul>
<li>
<p>
a new <tt>HASH_CLEAR</tt> operation clears a hash table in one step.
</p>
</li>
<li>
<p>
a new <tt>HASH_SELECT</tt> operation inserts those elements from one hash that
  satisfy a given condition into another hash. The selected items have
  dual presence in both hash tables. For example a game could select the
  visible polygons from a hash of all polygons.
</p>
</li>
<li>
<p>
fixed a compile-time error which occurred if the final argument to
  <tt>HASH_ADD_KEYPTR</tt> was a pointer to an array member like <tt>&amp;a[i]</tt>
</p>
</li>
<li>
<p>
added another test script <tt>tests/all_funcs</tt> which executes the test suite
  using every supported hash function
</p>
</li>
</ul></div>
<div class="paragraph"><p>And lastly,</p></div>
<div class="ulist"><ul>
<li>
<p>
a new, separate header called <a href="utlist.html">utlist.h</a> is included which
  provides <em>linked list macros</em> for C structures, similar in style to the
  uthash macros
</p>
</li>
</ul></div>
</div>
<h2 id="_version_1_5_2009_02_19">Version 1.5 (2009-02-19)</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
now thread-safe for concurrent readers
</p>
</li>
<li>
<p>
use scratch variables on stack rather than in table (thanks, Petter Arvidsson!).
  This change made HASH_FIND about 13% faster and enabled reader concurrency.
</p>
</li>
<li>
<p>
made <a href="license.html">BSD license</a> terms even more permissive
</p>
</li>
<li>
<p>
added <a href="userguide.pdf">PDF version</a> of User Guide
</p>
</li>
<li>
<p>
added <a href="http://troydhanson.wordpress.com/feed/">update news</a> <span class="image">
<img src="img/rss.png" alt="(RSS)" title="(RSS)" />
</span>
</p>
</li>
</ul></div>
</div>
<h2 id="_version_1_4_2008_09_23">Version 1.4 (2008-09-23)</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
Add <tt>HASH_COUNT</tt> for counting items in the hash
</p>
</li>
<li>
<p>
Compatibility with C++. Satisfy additional casting requirements.
  Also in the <tt>tests/</tt> directory, running <tt>make cplusplus</tt> now compiles
  all the test programs with the C++ compiler.
</p>
</li>
<li>
<p>
Eliminate <tt>elmt</tt> pointer from the UT_hash_handle. Calculate elmt
  from hash handle address by subtracting <tt>hho</tt> (hash handle offset).
</p>
</li>
<li>
<p>
Contributed by L.S.Chin:
  Cast <tt>void*</tt> to char* before pointer arithmetic to suppress compiler
  warnings. We assume compilers abide to C standards which impose
  requirement that <tt>sizeof(void*) == sizeof(char*)</tt>.
</p>
</li>
<li>
<p>
Return meaningful exit status from do_tests per Tiago Cunha,
  so that package manager-based install can verify tests are successful
</p>
</li>
</ul></div>
</div>
<h2 id="_version_1_3_2008_07_27">Version 1.3 (2008-07-27)</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
use integer-only math-- no floating point! Support FPU-less CPU&#8217;s.
</p>
</li>
<li>
<p>
eliminate <tt>hash_q</tt> metric, which measured the fraction of items with
  non-ideal chain positions. We only need to know if this fraction
  is below 0.5. This is now determined using fast bitwise tests.
</p>
</li>
<li>
<p>
when an item is added to the hash, calculate the key&#8217;s hash value
  upfront and store it, instead of recomputing it as needed. This hashv
  is stored in the hash handle. Potentially major speed benefit for
  bucket expansion algorithm. Deleting is marginally improved too.
</p>
</li>
<li>
<p>
fixed a minor bug in the calculation of the max ideal chain length;
  line 446 in v1.2 erroneously calculated a/b*2 instead of a/(b*2).
  The effect of this bug was that bucket expansion could occur more
  readily because the per-bucket <em>max chain length multiplier factor</em>
  (which delays bucket expansion when certain buckets are overused)
  was set to a lower, expansion-favoring value than intended.
</p>
</li>
<li>
<p>
improved source commenting and improved variable names in structures
</p>
</li>
<li>
<p>
remove <tt>HASH_JSW</tt>. Lengthy random number array made code less readable
</p>
</li>
<li>
<p>
add <tt>HASH_SRT(hh,hash,cmp)</tt> as a generalized <tt>HASH_SORT(hash,cmp)</tt>.
  It was an omission in uthash 1.2 that there was no sort macro for
  hash handles with names other than hh.
</p>
</li>
<li>
<p>
Corrected <tt>HASH_FSCK</tt> so it works with any name for the hash handle.
</p>
</li>
<li>
<p>
behave properly in pathological <tt>HASH_DEL(a,a)</tt> case where the same
  variable references the head and the deletee (advancing the head
  then loses the correct reference to the deletee); fix by using
  scratch area in the hash table to store deletee hash handle.
</p>
</li>
<li>
<p>
made tests runnable on MinGW
</p>
</li>
<li>
<p>
3000+ downloads since uthash-1.0
</p>
</li>
</ul></div>
</div>
<h2 id="_version_1_2_2006_11_22">Version 1.2 (2006-11-22)</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
new <tt>HASH_SORT</tt> macro
</p>
</li>
<li>
<p>
Cygwin support
</p>
</li>
<li>
<p>
User Guide now features a clickable Table of Contents.
  (The technique for generating the TOC on the browser was contributed
  back to the AsciiDoc project and incorporated into AsciiDoc v8.1.0).
</p>
</li>
</ul></div>
</div>
<h2 id="_version_1_1_2006_06_28">Version 1.1 (2006-06-28)</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
uthash-1.1 released
</p>
</li>
<li>
<p>
supports several built-in user-selectable hash functions
</p>
</li>
<li>
<p>
new keystats utility quantifies performance of hash functions
</p>
</li>
</ul></div>
</div>
<h2 id="_version_1_0_2006_06_02">Version 1.0 (2006-06-02)</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
Initial release
</p>
</li>
</ul></div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2009-05-08 23:44:27 EDT
</div>
</div>
</body>
</html>
